package org.puc.enquete.servlet;

import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.puc.enquete.ejb.EnqueteBeanLocal;
import org.puc.enquete.entity.Enquete;
import org.puc.enquete.ejb.OpcaoBeanLocal;
import org.puc.enquete.entity.Opcao;
import org.puc.enquete.entity.Usuario;
import org.puc.enquete.excecoes.EnqueteNaoCadastradaException;


/**
 * Este servlet controla a página de alteração de uma enquete
 * Implementação: Patrícia/Samuel
 */
public class AlterarEnquete extends HttpServlet {
   
    @EJB
    private EnqueteBeanLocal enqueteBean;
    @EJB
    private OpcaoBeanLocal opcaoBean;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        String idEnquete = request.getParameter("enquete");
        Enquete enqueteAtual;
        try {

            enqueteAtual = enqueteBean.obterEnquete(Integer.parseInt(idEnquete));

        } catch (EnqueteNaoCadastradaException ex) {
            request.setAttribute("erro", ex.getMessage());
            //se ocorreu um erro, coloca os dados para restaurar o formulário
            request.setAttribute("tituloweb", "Alterar");
            request.getRequestDispatcher("/jsp/dados_enquete.jsp").forward(request, response);
            return;
        }

        String confirma = request.getParameter("confirma");
        if (confirma != null && confirma.equals("1")) {

            String titulo = request.getParameter("titulo");
            String descricao = request.getParameter("descricao");
            String strdataPublicacao = request.getParameter("dataPublicacao");
            String strhoraPublicacao = request.getParameter("horaPublicacao");
            String strdataEncerramento = request.getParameter("dataEncerramento");
            String strhoraEncerramento = request.getParameter("horaEncerramento");

            try {

                //validações
                if (titulo == null || titulo.length() < 20) {
                    throw new Exception("O Titulo precisa ter pelo menos 20 caracteres!");
                }
                if (descricao == null || descricao.length() < 1) {
                    throw new Exception("A Descricao deve ser preenchida!");
                }

                if (strdataPublicacao == null || strdataPublicacao.length() < 10) {
                    throw new Exception("A Data de Publicação deve ser preenchida!");
                }
                if (strhoraPublicacao == null || strhoraPublicacao.length() < 5) {
                    throw new Exception("A Hora de Publicação deve ser preenchida!");
                }
                if (strdataEncerramento == null || strdataEncerramento.length() < 10) {
                    throw new Exception("A Data de Encerramento deve ser preenchida!");
                }
                if (strhoraEncerramento == null || strhoraEncerramento.length() < 5) {
                    throw new Exception("A Hora de Encerramento deve ser preenchida!");
                }

                Usuario usuarioAtual = (Usuario) request.getSession().getAttribute("usuario");

                DateFormat df = new SimpleDateFormat("dd/MM/yyyy kk:mm");
                Date dataPublicacao;
                try {
                    dataPublicacao = df.parse(strdataPublicacao.trim() + " " + strhoraPublicacao.trim());
                } catch (Throwable e) {
                    throw new Exception("Data de Publicação inválida!");
                }
                Date dataEncerramento;
                try {
                    dataEncerramento = df.parse(strdataEncerramento + " " + strhoraEncerramento);
                } catch (Throwable e) {
                    throw new Exception("Data de Encerramento inválida!");
                }

                enqueteAtual.setTitulo(titulo);
                enqueteAtual.setDescricao(descricao);
                enqueteAtual.setUsuario(usuarioAtual);
                enqueteAtual.setDataPublicacao(dataPublicacao);
                enqueteAtual.setDataEncerramento(dataEncerramento);

                //pega opções
                List<Opcao> opcoes = new ArrayList<Opcao>();
                int ordem = 0;
                for (int i = 1; i <= 7; i++) {

                    String descricaoOpcao = request.getParameter("opcao" + i);
                    String idOpcao = request.getParameter("opcao" + i + "_id");
                    if (descricaoOpcao != null && descricaoOpcao.length() > 0) {

                        Opcao opcao = new Opcao();

                        //se tiver o ID, significa q está atualizando a opção
                        if (idOpcao != null && idOpcao.length() > 0) {

                            opcao.setId(Integer.valueOf(idOpcao));
                            
                        }

                        opcao.setEnquete(enqueteAtual);
                        opcao.setDescricao(descricaoOpcao);
                        opcao.setOrdem(ordem++);
                        opcoes.add(opcao);

                    } else {

                        //se não tem mais e tinha, então exclui
                        if (idOpcao != null && idOpcao.length() > 0) {
                            
                            Opcao opcao = new Opcao();
                            opcao.setId(Integer.valueOf(idOpcao));
                            opcao.setEnquete(enqueteAtual);
                            opcaoBean.excluirOpcao(opcao);

                        }

                    }

                }

                //valida se o usuário incluiu pelo menos duas opções
                if (opcoes.size() <= 1) {
                    throw new Exception("Coloque pelo menos duas opções!");
                }

                enqueteAtual.setOpcoes(opcoes);
                enqueteBean.alterarEnquete(enqueteAtual);
                request.setAttribute("mensagem", "Enquete atualizada com sucesso!");
                request.getRequestDispatcher("/ListarEnquetes").forward(request, response);

            } catch (Throwable e) {
                //coloca a mensagem de erro
                String msg = e.getMessage();
                if (msg == null || msg.length() == 0 && e.getCause() != null) {
                    msg = e.getCause().getMessage();
                }
                if (msg == null || msg.length() == 0) {
                    msg = "Ocorreu um erro: " + e.getClass().getSimpleName();
                } else {
                    msg = msg + " (" + e.getClass().getSimpleName() + ")";
                }
                request.setAttribute("erro", msg);
                
                //se ocorreu um erro, coloca os dados para restaurar o formulário
                request.setAttribute("titulo", titulo);
                request.setAttribute("descricao", descricao);
                request.setAttribute("dataPublicacao", strdataPublicacao);
                request.setAttribute("horaPublicacao", strhoraPublicacao);
                request.setAttribute("dataEncerramento", strdataEncerramento);
                request.setAttribute("horaEncerramento", strhoraEncerramento);

                for (int i = 1; i <= 7; i++) {

                    request.setAttribute("opcao" + i, request.getParameter("opcao" + i));
                    request.setAttribute("opcao" + i + "_id", request.getParameter("opcao" + i + "_id"));

                }

            }

        } else {

            // se não estiver confirmando, coloca dados atuais da enquete
            request.setAttribute("titulo", enqueteAtual.getTitulo());
            request.setAttribute("descricao", enqueteAtual.getDescricao());

            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            DateFormat hf = new SimpleDateFormat("kk:mm");

            Date strdataPublicacao = enqueteAtual.getDataPublicacao();
            String dataPublicacao = df.format(strdataPublicacao);
            request.setAttribute("dataPublicacao", dataPublicacao);

            String horaPublicacao = hf.format(strdataPublicacao);
            request.setAttribute("horaPublicacao", horaPublicacao);

            Date strdataEncerramento = enqueteAtual.getDataEncerramento();
            String dataEncerramento = df.format(strdataEncerramento);
            request.setAttribute("dataEncerramento", dataEncerramento);

            String horaEncerramento = hf.format(strdataEncerramento);
            request.setAttribute("horaEncerramento", horaEncerramento);

            List<Opcao> opcoes = enqueteAtual.getOpcoes();
            for (int i = 1; i <= opcoes.size(); i++) {
                request.setAttribute("opcao" + i, opcoes.get(i-1).getDescricao());
                request.setAttribute("opcao" + i + "_id", opcoes.get(i-1).getId());
            }

        }

        request.setAttribute("tituloweb", "Alterar");
        request.getRequestDispatcher("/jsp/dados_enquete.jsp").forward(request, response);
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

}
